package com.ruoyi.web.controller.system;

import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.system.service.IAliPayService;
import com.ruoyi.system.service.IWechatPayService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.Map;

@RestController
@RequestMapping("/api/pay")
public class PayController extends BaseController {

    @Resource
    private IWechatPayService wechatPayService;

    @Autowired
    private IAliPayService aliPayService;

    /**
     * 获取支付宝支付参数（适配前端`alipay.js`）
     * 请求方式：POST
     * 请求参数：JSON格式（orderNo: 订单号, totalAmount: 支付金额（元）, subject: 商品名称, body: 商品描述）
     * 返回结果：若依框架统一响应（AjaxResult），data字段为支付宝支付参数字符串
     */
    @PostMapping("/getAlipayPayParams")
    public AjaxResult getAlipayPayParams(@RequestBody Map<String, Object> params) {
        try {
            // 1. 安全获取参数（支持字符串和数字类型）
            String orderNo = getStringParam(params, "orderNo");
            BigDecimal totalAmount = getBigDecimalParam(params, "totalAmount");
            String subject = getStringParam(params, "subject");
            String body = getStringParam(params, "body");

            // 2. 参数验证
            if (orderNo == null || orderNo.isEmpty()) {
                throw new IllegalArgumentException("订单号(orderNo)不能为空");
            }
            if (totalAmount == null || totalAmount.compareTo(BigDecimal.ZERO) <= 0) {
                throw new IllegalArgumentException("支付金额(totalAmount)必须大于0");
            }

            // 2. 调用Service生成支付参数
            String payParams = aliPayService.generateAlipayPayParams(orderNo, totalAmount, subject, body);

            // 3. 返回成功结果（若依框架规范：使用AjaxResult.success，data字段存支付参数）
            return AjaxResult.success("获取支付宝支付参数成功", payParams);
        } catch (IllegalArgumentException e) {
            // 4. 处理参数校验异常（返回错误信息，前端可直接提示用户）
            logger.error("参数错误：{}", e.getMessage());
            return AjaxResult.error(e.getMessage());
        } catch (Exception e) {
            // 5. 处理其他异常（如支付宝API调用失败）
            logger.error("获取支付宝支付参数失败：{}", e.getMessage(), e);
            return AjaxResult.error("获取支付参数失败，请重试");
        }
    }

    // 安全获取字符串参数
    private String getStringParam(Map<String, Object> params, String key) {
        Object value = params.get(key);
        return value != null ? value.toString() : null;
    }

    // 安全获取BigDecimal参数
    private BigDecimal getBigDecimalParam(Map<String, Object> params, String key) {
        Object value = params.get(key);
        if (value == null) return null;

        try {
            if (value instanceof BigDecimal) {
                return (BigDecimal) value;
            } else if (value instanceof Number) {
                return BigDecimal.valueOf(((Number) value).doubleValue());
            } else {
                return new BigDecimal(value.toString());
            }
        } catch (NumberFormatException e) {
            throw new IllegalArgumentException("参数 " + key + " 格式错误，应为数字类型");
        }
    }

    /**
     * 获取微信支付参数（前端调用）
     * @param params 前端传递的参数（orderNo：订单号；totalFee：金额（分）；openId：用户OpenID）
     * @return AjaxResult（成功返回支付参数，失败返回错误信息）
     */
    @PostMapping("/getWechatPayParams")
    public AjaxResult getWechatPayParams(@RequestBody Map<String, Object> params) {
        try {
            // 1. 获取前端传递的参数
            String orderNo = (String) params.get("orderNo");
            String openId = (String) params.get("openId");

            // 修复：将totalFee从String转换为Integer，并添加异常处理
            Integer totalFee;
            try {
                // 将金额字符串转换为BigDecimal
                BigDecimal amount = new BigDecimal(params.get("totalFee").toString());

                // 验证金额有效性
                if (amount.compareTo(BigDecimal.ZERO) <= 0) {
                    return AjaxResult.error("支付金额必须大于0");
                }
                // 元转分（乘以100后取整）
                totalFee = amount.multiply(new BigDecimal("100")).intValueExact();

            } catch (NumberFormatException | ArithmeticException e) {
                return AjaxResult.error("支付金额格式错误，示例：0.01");
            } catch (NullPointerException e) {
                return AjaxResult.error("未提供支付金额");
            }

            // 2. 校验参数完整性
            if (orderNo == null || totalFee == null || openId == null) {
                return AjaxResult.error("参数缺失（orderNo、totalFee、openId均为必填）");
            }

            // 3. 调用服务层获取支付参数
            Map<String, String> payParams = wechatPayService.getWechatPayParams(orderNo, totalFee, openId);

            // 4. 返回成功结果（包含支付参数）
            return AjaxResult.success("获取支付参数成功", payParams);
        } catch (Exception e) {
            // 5. 返回失败结果（包含错误信息）
            return AjaxResult.error("获取支付参数失败：" + e.getMessage());
        }
    }

}
